package forms;

import beans.Promotion;
import dao.DAOException;
import dao.PromotionDAO;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;

public class AjouterPromotionForm {

    private static final String CHAMP_LIBELLE = "libelle"; 
    private static final String CHAMP_ANNEE = "annee";
    
    private static final Integer ANNEE_MIN = 2011 ;
    private static final Integer ANNEE_MAX = 3000;
    private String              resultat;
    private Map<String, String> erreurs          = new HashMap<String, String>();
    private PromotionDAO      promotionDao;

    public AjouterPromotionForm( PromotionDAO promotionDao ) {
        this.promotionDao = promotionDao;
    }

    public Map<String, String> getErreurs() {
        return erreurs;
    }

    public String getResultat() {
        return resultat;
    }
    
    public Promotion creerPromotion( HttpServletRequest request ) {
        String nomPromotion = getValeurChamp( request, CHAMP_LIBELLE );
        Integer anneePromotion = Integer.parseInt(getValeurChamp( request, CHAMP_ANNEE ));
        Promotion promotion = new Promotion();        
                
        try {
            traiterPromotion(nomPromotion, promotion); 
            traiterAnneePromotion(anneePromotion, promotion);
            if ( erreurs.isEmpty() ) {
                promotionDao.creerPromotion(promotion);
                resultat = "La promotion a été crée avec succès.";
            } else {
                resultat = "Echec de création de la promotion, veuillez recommencer.";
            }
        } catch ( DAOException e ) {
            resultat = "Echec lors de la création de la promotion : une erreur imprévue est survenue, merci de réessayer dans quelques instants.";
            e.printStackTrace();
        } 
        return promotion;
    }
    
    private void traiterAnneePromotion( Integer anneePromotion, Promotion promo) {
        try {
            if (anneePromotion < ANNEE_MIN || anneePromotion > ANNEE_MAX) {
                throw new FormValidationException( "L'année de la promotion doit être comprise entre " + ANNEE_MIN + " et " + ANNEE_MAX + "."  );
            }
            
        } catch ( FormValidationException e ) {
            setErreur( CHAMP_ANNEE, e.getMessage() );
        }
        promo.setAnnee_promo(anneePromotion);
        
    }
    
    private void traiterPromotion( String nomPromotion, Promotion promo) {
        try {
            if (nomPromotion == null) {
                throw new FormValidationException( "Le nom de la promotion ne doit pas être vide." );
            }
            else if (nomPromotion.length() < 5 ) {
                throw new FormValidationException( "Le nom de la promotion doit contenir au moins 5 caractères." );
        }
        } catch ( FormValidationException e ) {
            setErreur( CHAMP_LIBELLE, e.getMessage() );
        }
        promo.setLibelle_promo(nomPromotion);
    }
       
    /*
     * Ajoute un message correspondant au champ spécifié à la map des erreurs.
     */
    private void setErreur( String champ, String message ) {
        erreurs.put( champ, message );
    }

    /*
     * Méthode utilitaire qui retourne null si un champ est vide, et son contenu
     * sinon.
     */
    private static String getValeurChamp( HttpServletRequest request, String nomChamp ) {
        String valeur = request.getParameter( nomChamp );
        if ( valeur == null || valeur.trim().length() == 0 ) {
            return null;
        } else {
            return valeur;
        }
    }

}
